package com.essence.grabiec104.grab.dao;

import com.essence.common.model.BytesFrame;
import com.essence.common.model.Packet;
import com.essence.common.model.Substation;
import com.essence.grabiec104.grab.model.CorrelationPointQuery;
import com.essence.grabiec104.grab.model.FrameStatistics;
import com.essence.grabiec104.grab.model.PointInfo;
import com.essence.grabiec104.grab.model.SelectFramesParams;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.essence.common.model.Point;

import java.util.List;

@Mapper
public interface GrabberDao {
    /**
     * 插入字节帧
     *
     * @param bytesFrame 字节帧, 返回插入的ID
     */
    void insertBytesFrame(@Param("bf") BytesFrame bytesFrame);

    /**
     * 更新字节帧的解析错误的原因
     *
     * @param frameId       字节帧ID
     * @param analysisCause 解析错误原因
     */
    void updateBytesFrameAnalysisCause(@Param("id") long frameId, @Param("cause") String analysisCause);

    /**
     * 插入报文
     *
     * @param packet       报文, 插入成功返回插入的ID
     * @param bytesFrameId 字节帧ID
     */
    void insertPacket(@Param("pkt") Packet packet, @Param("fid") long bytesFrameId);

    /**
     * 插入报文点号信息
     *
     * @param point 报文点号信息
     */
    int insertPointSetting(@Param("point") Point point);

    /**
     * 更新报文点号信息
     *
     * @param point 报文点号信息
     */
    int updatePointSetting(@Param("point") Point point);

    int countPointSettingByStateIdAndPointAddress(@Param("point") Point point);

    int selectPointSettingIdByPointAddress(@Param("pointAddress") int pointAddress, @Param("substationId") long substationId);

    int selectPacketBySubstation(@Param("host") String host, @Param("startTime") long startTime);

    List<FrameStatistics> getControlFrameTotalStatistics(@Param("startTime") long startTime);

    List<BytesFrame> selectFrame(@Param("srcHost") String srcHost, // 源地址
                                 @Param("dstHost") String dstHost, // 目的地址
                                 @Param("startTime") long startTime, // 开始时间
                                 @Param("endTime") long endTime, // 结束时间
                                 @Param("limit") int limit, // 获取条数
                                 @Param("offset") int offset); // 偏移量

    Point selectPointSettingBySubstationIdAndPointAddress(@Param("substationId") long substationId,
                                                          @Param("pointAddress") int pointAddress);

    int insertPacketPointInfo(@Param("point") Point point);

    List<PointInfo> selectPointInfos(@Param("params") SelectFramesParams params);

    int selectPointInfoCount(@Param("params") SelectFramesParams params);

    CorrelationPointQuery selectCorrelationPointQuery(@Param("address") int pointAddress, @Param("subHost") String subHost);

    int controlInstructionNumber();

    List<PointInfo> selectPointInfosLatest(@Param("limit") int limit);

    /**
     * 根据时间范围和传输标识列表查询报文
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param tieIds    传输标识列表
     */
    int selectPacketsByTimeAndTieIds(@Param("startTime") long startTime,
                                     @Param("endTime") long endTime,
                                     @Param("tieIds") List<Integer> tieIds);

    void emptyPointFilter();

    void insertPointFilter(@Param("point") Point point);

    int countPointFilter(@Param("point") Point point);

    /**
     * 根据时间戳删除报文点号信息表中的历史数据
     *
     * @param timestamp 时间戳
     */
    void deletePointInfoByTimestamp(@Param("timestamp") long timestamp);

    /**
     * 根据时间戳删除报文表中的历史数据
     *
     * @param timestamp 时间戳
     */
    void deletePacketByTimestamp(@Param("timestamp") long timestamp);

    /**
     * 根据时间戳删除字节帧表中的历史数据
     *
     * @param timestamp 时间戳
     */
    void deleteBytesFrameByTimestamp(@Param("timestamp") long timestamp);

    /**
     * 获取最近的N条数据中ID最小的值
     *
     * @param count 保留的数据条数
     * @return 最小ID值
     */
    Long getMinIdOfLatestData(@Param("count") int count);

    /**
     * 根据最小ID删除报文点号信息表中的历史数据
     *
     * @param minId 最小ID值
     */
    void deletePointInfoByMinId(@Param("minId") long minId);

    /**
     * 根据最小ID删除报文表中的历史数据
     *
     * @param minId 最小ID值
     */
    void deletePacketByMinId(@Param("minId") long minId);

    /**
     * 根据最小ID删除字节帧表中的历史数据
     *
     * @param minId 最小ID值
     */
    void deleteBytesFrameByMinId(@Param("minId") long minId);

    Substation selectSubstationByHost(@Param("host") String host);
}
